namespace a {
    // 接口定义的属性会和类中的属性合并
    interface Person {
        xx: string;
        yy: number;
    }
    function handlerClass(target: any) {
        // 这里的target代表Person这个类
        target.prototype.xx = '哈哈哈';
        target.prototype.yy = '人生如梦';
    }
    @handlerClass
    class Person {
        constructor() {

        }
    }
    let p = new Person()
    // console.log(Person.zz)
    // console.log(p.xx)
    // console.log(p.yy)
}
// 属性装饰器 装饰属性
namespace c {
    // target如果修饰的是一个普通属性的话，那么这个target指向的是原型Person.prototype
    // target装饰的是一个类的属性static ,那么这个target指向类的定义
    function upperCase(target: any, propName: string) {
        let value = target[propName]
        console.log('value:', value)
        let get = () => {
            console.log('get:', value)
            return value
        }
        let set = (newVal: string) => {
            console.log('set:', newVal)
            value = newVal.toUpperCase();
        }
        Object.defineProperty(target, propName, {
            get,
            set,
            configurable: true,
            writable: true,
            enumerable: true
        })
    }
    class Person {
        // 表示的是实例的属性
        @upperCase
        name: string = 'leichao'
    //    readonly name: string = 'leichao'
    }
    let p = new Person()
    p.name = 'jiagou';
    console.log(p.name)
}